home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 45 / Amiga Format CD45 (1999-09)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-11].iso / -serious- / programming / basic / messages / prog_a.bb2 < prev    next >
Text File  |  1999-08-09  |  3KB  |  84 lines

  1. ; RUN THIS FROM THE CLI ONCE COMPILED
  2. ; Run this program before the other one from the CLI, i.e.
  3. ; 1> run prog_a <RETURN>
  4. ; 1> run prog_b <RETURN>
  5.  
  6. ; You will need blitzlibs:amigalibs.res resident
  7. ; **********************************************
  8.  
  9. ; This program creates a public message port (so that other programs can
  10. ; talk to it, this is not required if the stuff that uses your message
  11. ; port is set up by yourself, i.e. commodities). It then waits for messages to
  12. ; arrive. Any messages that arrive get their number changed and returned.
  13. ; Once all messages are processed, the program ends.
  14.  
  15. ; The message will come in this form
  16. NEWTYPE.NrMessage
  17.   SystemMsg.Message
  18.   number.w
  19. End NEWTYPE
  20.  
  21. ; Declare a pointer to our message port
  22. DEFTYPE.MsgPort *msgp
  23.  
  24. ; Declare a pointer to the message
  25. DEFTYPE.NrMessage *nrmsg
  26.  
  27. ; Start of main program
  28. ; Try to create a message port: Name "NrPort", priority 0
  29. *msgp = CreateMsgPort_
  30. If *msgp = 0
  31.   NPrint "Could not create message port!"
  32.   End
  33. End If
  34. myportname$= "NrPort" ; NB: This string should not be changed, as the pointer
  35.                       ;     in the message port structure will point to it!
  36. *msgp\mp_Node\ln_Pri = 0
  37. *msgp\mp_Node\ln_Name = &myportname$
  38. AddPort_ *msgp  ; Add message port to the list of public message ports
  39.  
  40. ; Wait for a message to arrive
  41. NPrint "A: Waiting for message to arrive..."
  42. ;WaitPort_ *msgp ; NB: You could alternatively do the following (allows you to
  43.                 ;     wait for >1 message port). If using the following,
  44.                 ;     you must compare returnMask to all the other masks you
  45.                 ;     use, to check what has sent you the signal. I added
  46.                 ;     checking for CTRL-C to show what to do!
  47. msgpMask.l = 1 LSL *msgp\mp_SigBit
  48. signalset.l = msgpMask | #SIGBREAKF_CTRL_C ; Add other signals to this using logical OR
  49. returnMask.l = Wait_(signalset)
  50.  
  51. If returnMask = msgpMask
  52.   ; Now one or more messages has arrived, try to collect as many
  53.   ; messages as possible
  54.   *nrmsg = GetMsg_(*msgp)
  55.   While (*nrmsg)
  56.     ; Read the message
  57.     NPrint "A: The value received was: ",*nrmsg\number
  58.  
  59.     ; Alter it
  60.     *nrmsg\number = Rnd(32000)
  61.     NPrint "A: Value changed to: ",*nrmsg\number
  62.  
  63.     ; Reply to message
  64.     ReplyMsg_ *nrmsg
  65.     ; Now that we have replied, we cannot change or access the message any more!
  66.     *nrmsg = GetMsg_(*msgp)
  67.   Wend
  68. End If
  69.  
  70. If returnMask = #SIGBREAKF_CTRL_C Then NPrint "You pressed CTRL-C!"
  71.  
  72. ; Start clean up, use this next loop to clear port of all messages before
  73. ; removing it from public list, then deleting
  74. *nrmsg = GetMsg_(*msgp)
  75. While (*nrmsg)
  76.   ReplyMsg_ *nrmsg
  77.   *nrmsg = GetMsg_(*msgp)
  78. Wend
  79. RemPort_ *msgp          ; remove port from list of public ports
  80. DeleteMsgPort_ *msgp    ; delete message port
  81. NPrint "The end!"
  82. End
  83.  
  84.